package controlador;

import vista.InterfazGraficaProveedor;
import vista.Mensaje;
import java.awt.event.ActionEvent;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import modelo.Proveedor;
import modelo.ProveedorDao;

public class ControladorProveedor extends ControladorActualizadorBD implements ActionListener,WindowListener,FocusListener,KeyListener
{
	
	private enum MoverRegistro {PRIMERO,ATRAS,SIGUIENTE,ULTIMO};
	
	private InterfazGraficaProveedor interfazGrafica;
	private ControladorPrincipal controladorPrincipal;
	private ArrayList<Proveedor> proveedores;
    private ProveedorDao proveedorDao;
    private int i;
    private boolean guardando;
	
	public ControladorProveedor(ControladorPrincipal controladorPrincipal)
	{
		this.controladorPrincipal= controladorPrincipal;
		
        proveedorDao= new ProveedorDao();
		
		proveedores= new ArrayList<Proveedor>();
		i= 0;
		guardando=false;
		
		interfazGrafica= new InterfazGraficaProveedor();
		
		interfazGrafica.addListener((WindowListener) this);
		interfazGrafica.addListener((ActionListener) this);
		interfazGrafica.addListener((FocusListener)this);
		interfazGrafica.addListener((KeyListener)this);
		interfazGrafica.visualizarVentana();
	}
	
	private void moverRegistro(MoverRegistro enumMR)
	{
	
		if (proveedores.size()>0)
		{ 	 
			switch(enumMR)
			{
			  case PRIMERO:
			  {
		        i = 0;
			    break;
			  }
			  case ATRAS:
			  {
				 i -= 1;  
			     if (i<0)
			    	 i= proveedores.size()-1;
			     
			     break;
			  }
			  case SIGUIENTE:
			  {
				  i= (i + 1) % proveedores.size();
				   break; 
			  }
			  case ULTIMO:
			  {
				  i= proveedores.size() - 1;
				  break;  
			  }
			}
			actualizarVentana(proveedores.get(i));
		}		
	}
	
	private void actualizarVentana(Proveedor proveedor)
	{
		if (proveedor!=null)
		{
		   interfazGrafica.actualizarInfo(proveedor.getCodProveedor(), proveedor.getNombre(), proveedor.getDireccion(), proveedor.getTelefono());
		}		
	}
	
	@Override
	public void windowOpened(WindowEvent arg0) 
	{
		inicializarInfo();
	}
	
	@Override
	public void windowClosing(WindowEvent arg0) {
		interfazGrafica.descargarMemoria();
		controladorPrincipal.visualizarVentanaPrincipal();
	}

	@Override
	public void actionPerformed(ActionEvent e) 
	{
		if (e.getSource() instanceof javax.swing.JButton)
		{
			if (e.getActionCommand().equalsIgnoreCase("Siguiente"))
				moverRegistro(MoverRegistro.SIGUIENTE);
			else if (e.getActionCommand().equalsIgnoreCase("Ultimo"))
				moverRegistro(MoverRegistro.ULTIMO);
			else if (e.getActionCommand().equalsIgnoreCase("Atras"))
				moverRegistro(MoverRegistro.ATRAS);
			else if (e.getActionCommand().equalsIgnoreCase("Primero"))
				moverRegistro(MoverRegistro.PRIMERO);
			else if (e.getActionCommand().equalsIgnoreCase("Guardar"))
				guardar();
			else if(e.getActionCommand().equalsIgnoreCase("Modificar"))
				modificar();
			else if(e.getActionCommand().equalsIgnoreCase("Eliminar"))
				eliminar();
			else if (e.getActionCommand().equalsIgnoreCase("Cancelar"))
			{
				inicializarInfo();
			}		
			else if (e.getActionCommand().equalsIgnoreCase("Salir"))
			{
				controladorPrincipal.visualizarVentanaPrincipal();
				interfazGrafica.descargarMemoria();
		     }			
		
		}		
	   	
		
	}
	
	
	@Override
	protected Proveedor getObjecto() {
		Proveedor proveedor= new Proveedor(interfazGrafica.getCodProveedor(),interfazGrafica.getNombre(),interfazGrafica.getDireccion(),interfazGrafica.getTelefono());
		return proveedor;
	}

	@Override
	protected boolean isValido(Object objeto) {
		boolean valido=false;
		
		if (objeto instanceof Proveedor)
		{
			Proveedor proveedor= (Proveedor) objeto;
			valido= proveedor.validar();
		}
		
		return valido;
	}

	@Override
	protected boolean isExiste(Object objeto) throws Exception 
	{
		boolean existe= false;
		
		if (objeto instanceof Proveedor)
		{
		   Proveedor proveedor= (Proveedor) objeto;
		   existe=proveedorDao.consultarProveedor(proveedor);
		}
		
		return existe;
	}

	@Override
	protected boolean isEliminado(Object objeto) throws Exception 
	{
		boolean eliminado= false;
		
		if (objeto instanceof Proveedor)
		{
		   Proveedor proveedor= (Proveedor) objeto;
		   eliminado=proveedorDao.isEliminado(proveedor);
		}
		return eliminado;
	}

	@Override
	protected boolean activarObjeto(Object objeto) throws Exception 
	{
		boolean activado=false;
		
		if (objeto instanceof Proveedor)
		{
		   Proveedor proveedor= (Proveedor) objeto;
		   activado=proveedorDao.activarProveedor(proveedor);
		}
		
		return activado;
	}

	@Override
	protected boolean registrarObjeto(Object objeto) throws Exception 
	{
		boolean registrado= false;
		
		if (objeto instanceof Proveedor)
		{
			Proveedor proveedor= (Proveedor) objeto;
			registrado= proveedorDao.registrarProveedor(proveedor);
		}
		
		return registrado;
	}

	@Override
	protected boolean actualizarObjeto(Object objeto) throws Exception 
	{
		boolean actualizado= false;
		
		if (objeto instanceof Proveedor)
		{
		    Proveedor proveedor= (Proveedor) objeto;
		    actualizado=proveedorDao.actualizarProveedor(proveedor);
		}
		
		return actualizado;
	}

	@Override
	protected boolean eliminarObjeto(Object objeto) throws Exception 
	{
		boolean eliminado= false;
		
		if (objeto instanceof Proveedor)
		{
			Proveedor proveedor= (Proveedor) objeto;
			eliminado= proveedorDao.eliminarProveedor(proveedor);
		}
		
		return eliminado;
	}

	@Override
	protected boolean isDependiente(Object objeto) throws Exception 
	{
		boolean dependiente= false;
		
		if (objeto instanceof Proveedor)
		{
			Proveedor proveedor= (Proveedor) objeto;
			dependiente= proveedorDao.isDependiente(proveedor);
		}
		
		return dependiente;
	}

	@Override
	protected void inicializarInfo() 
	{		
		try
		{
			
		  if (!proveedores.isEmpty())	
			proveedores.clear();
		  
		  proveedores.addAll(proveedorDao.consultarProveedoresActivos());
		  moverRegistro(MoverRegistro.PRIMERO);
		  
		  if (!proveedores.isEmpty())
		  {
				interfazGrafica.deshabilitarBotonActualizar("Guardar");
				interfazGrafica.habilitarBotonActualizar("Eliminar");
				interfazGrafica.deshabilitarBotonActualizar("Cancelar");
				interfazGrafica.habilitarNavegacion();
		  }
		  else
		  {
				
				interfazGrafica.habilitarBotonActualizar("Guardar");
				interfazGrafica.deshabilitarBotonActualizar("Eliminar");
				interfazGrafica.habilitarBotonActualizar("Cancelar");
				interfazGrafica.deshabilitarNavegacion();
		  }		
			
		  interfazGrafica.deshabilitarBotonActualizar("Modificar");
			
		  guardando=false;
		}
		catch(Exception e)
		{
			Mensaje.mostrarError(e.getMessage());
			controladorPrincipal.visualizarVentanaPrincipal();
			interfazGrafica.descargarMemoria();
		}
		
	}
	
	@Override
	public void focusLost(FocusEvent evt) 
	{
		if (evt.getSource() instanceof javax.swing.JTextField)
		{
			
			Proveedor p= new Proveedor(interfazGrafica.getCodProveedor(),"","","");
			
			try
			{
			  
			  /*Actualiza el ArrayList con la base de datos*/
			  if (!proveedores.containsAll(proveedorDao.consultarProveedoresActivos()))
			  {
				  if (!proveedores.isEmpty())	
						proveedores.clear();
					  
				  proveedores.addAll(proveedorDao.consultarProveedoresActivos());
			  } 
			 /********************************************/
			 	
			  if (proveedores.contains(p))
			  {
				 i= proveedores.indexOf(p); 
				 actualizarVentana(proveedores.get(i));
                 interfazGrafica.deshabilitarBotonActualizar("Guardar");
                 interfazGrafica.habilitarBotonActualizar("Eliminar");
                 interfazGrafica.deshabilitarBotonActualizar("Modificar");
                 interfazGrafica.deshabilitarBotonActualizar("Cancelar");
				 
                 interfazGrafica.habilitarNavegacion();
				 guardando=false;
				 
			  }
			  else
			  {
				 interfazGrafica.limpiarTextos();
				 interfazGrafica.habilitarBotonActualizar("Guardar");
				 interfazGrafica.habilitarBotonActualizar("Cancelar");
				 interfazGrafica.deshabilitarBotonActualizar("Modificar");
				 interfazGrafica.deshabilitarBotonActualizar("Eliminar");
				 interfazGrafica.deshabilitarNavegacion();
				 guardando= true;
			  }
			  
			  
			}
			catch(Exception e)
			{
				Mensaje.mostrarError(e.getMessage());
			}
			
		}
		
		
	}

	

	@Override
	public void keyTyped(KeyEvent evt) 
	{
		if (evt.getSource() instanceof javax.swing.text.JTextComponent)
		{
			javax.swing.text.JTextComponent txt= (javax.swing.text.JTextComponent) evt.getSource();
			
			if (txt.getName().equalsIgnoreCase("txtCodProveedor"))
			{
				
			   if ('-'!=evt.getKeyChar()  && !Character.isDigit(evt.getKeyChar()))	   
		               evt.setKeyChar(Character.MIN_VALUE);
		           
				
				if (interfazGrafica.getCodProveedor().length()==Proveedor.MAXCODIGO)
					evt.setKeyChar(Character.MIN_VALUE);
				
			}
			else if ((txt.getName().equalsIgnoreCase("txtNombre")))
			{
				if ((char)KeyEvent.VK_BACK_SPACE!= evt.getKeyChar() && (Character.isDigit(evt.getKeyChar()) || interfazGrafica.getNombre().length()==Proveedor.MAXNOMBRE))
					evt.setKeyChar(Character.MIN_VALUE);
				else
				{
					if (guardando)
					{
						interfazGrafica.habilitarBotonActualizar("Guardar");
						interfazGrafica.deshabilitarBotonActualizar("Modificar");
						interfazGrafica.deshabilitarBotonActualizar("Eliminar");
					}
				    else
					{
				    	interfazGrafica.deshabilitarBotonActualizar("Guardar");
				    	interfazGrafica.habilitarBotonActualizar("Modificar");
				    	interfazGrafica.deshabilitarBotonActualizar("Eliminar");
					}
					interfazGrafica.habilitarBotonActualizar("Cancelar");
				}
			}
			else if (txt.getName().equalsIgnoreCase("txtDireccion"))
			{
				if ((char)KeyEvent.VK_BACK_SPACE!= evt.getKeyChar() &&  interfazGrafica.getDireccion().length()==Proveedor.MAXDIRECCION)
					evt.setKeyChar(Character.MIN_VALUE);
				else
				{
					if (guardando)
					{
						interfazGrafica.habilitarBotonActualizar("Guardar");
						interfazGrafica.deshabilitarBotonActualizar("Modificar");
						interfazGrafica.deshabilitarBotonActualizar("Eliminar");
					}
				    else
					{
				    	interfazGrafica.deshabilitarBotonActualizar("Guardar");
				    	interfazGrafica.habilitarBotonActualizar("Modificar");
				    	interfazGrafica.deshabilitarBotonActualizar("Eliminar");
					}
					interfazGrafica.habilitarBotonActualizar("Cancelar");
				}
			}
			else if (txt.getName().equalsIgnoreCase("txtTelefono"))
			{		
				if ((char)KeyEvent.VK_BACK_SPACE!= evt.getKeyChar() && (!Character.isDigit(evt.getKeyChar()) || interfazGrafica.getTelefono().length()==Proveedor.MAXTELEFONO))
			         evt.setKeyChar(Character.MIN_VALUE);
				else
				{
					
					if (guardando)
					{
						interfazGrafica.habilitarBotonActualizar("Guardar");
						interfazGrafica.deshabilitarBotonActualizar("Modificar");
						interfazGrafica.deshabilitarBotonActualizar("Eliminar");
					}
				    else
					{
				    	interfazGrafica.deshabilitarBotonActualizar("Guardar");
				    	interfazGrafica.habilitarBotonActualizar("Modificar");
				    	interfazGrafica.deshabilitarBotonActualizar("Eliminar");
					}
					interfazGrafica.habilitarBotonActualizar("Cancelar");
				}
				
			}
			
			
			
		}
			
		
	}

    
	/*****************Metodos No Implementados************/
	@Override
	public void windowActivated(WindowEvent arg0) {}

	@Override
	public void windowClosed(WindowEvent arg0) {}

	@Override
	public void windowDeactivated(WindowEvent arg0) {}

	@Override
	public void windowDeiconified(WindowEvent arg0) {}

	@Override
	public void windowIconified(WindowEvent arg0) {}
	
	@Override
	public void focusGained(FocusEvent arg0) {}
	
	@Override
	public void keyPressed(KeyEvent arg0) {}

	@Override
	public void keyReleased(KeyEvent arg0) {}
    /******************************************************/
	
}
